<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>new运算符和作用域</title>
    </head>
    <body>
		<p>为了实现：在不重写函数的情况下，具有多个相同功能的函数，，需要使用new运算符以及构造函数。</p>
		<p>但是单纯的构造函数会造成内存损耗，同样的内容会被复制多变，所以对于使用同一个构造函数的两个对象，如果的是静态的属性，使用prototype原型来进行继承。</p>
		<p>如果打算在充当类对象的函数中使用new函数，需要使用<strong>this这个关键字来纠正它产生的错误。new会产生一个structure()构造子，我们可以自定义一个真的同名构造子</strong></p>
		<p>构造函数是window对象的方法，this指向windo；使用new操作后，this将指向新生成的对象。</p>
		<script>
		// 构造函数   与普通函数的区别就是首字母大写；使用new操作符 
			function Cat(name,color){
				this.name=name,
				this.color=color
				this.structure=function(_name,_color){
					alert(_name);
				}
				// this.structure(name,color);  //用structrue真构造子充当Cat的伪构造子
				// console.log(this)
			}
			Cat.prototype.type="猫科";   //cat1,cat2这两个实例对象具有私有属性name,color以及公有属性：type,eat()
			Cat.prototype.eat=function(){
				console.log('eat mouse');
			}

		//new一个对象
		var cat1=new Cat('cat1','red');   //this指向new的对象
		var cat2=new Cat('cat2','green');  //this指向new的对象
		Cat('cat3','blue');	//this指向window  所以，如果使用到this的对象需要使用new来控制作用域
		cat1.eat();
		//某个构造对象是不是该实例对象的原型
		console.log(Cat.prototype.isPrototypeOf(cat1)); //true
		//判断某属性是不是该实例的本地属性
		console.log(cat1.hasOwnProperty('type'));//false
		console.log(cat1.hasOwnProperty('name'));//true
		//判断某实例是不是含有执行指定的属性  in
		console.log('sex' in cat1);//false
		console.log('name' in cat1);//true
		</script>
    </body>
</html>